/*******************************************************************************
 * KindEditor - WYSIWYG HTML Editor for Internet Copyright (C) 2006-2011
 * kindsoft.net
 * 
 * @author Roddy <luolonghao@gmail.com>
 * @site http://www.kindsoft.net/
 * @licence http://www.kindsoft.net/license.php
 ******************************************************************************/

KindEditor.plugin('emoticons', function(K) {
	var self = this, name = 'emoticons', path = (self.emoticonsPath || self.pluginsPath
			+ 'emoticons/images/'), allowPreview = self.allowPreviewEmoticons === undefined
			? true
			: self.allowPreviewEmoticons, currentPageNum = 1;
	self.clickToolbar(name, function() {
		var rows = 5, cols = 9, total = 135, startNum = 0, cells = rows * cols, pages = Math
				.ceil(total / cells), colsHalf = Math.floor(cols / 2), wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'), elements = [], menu = self
				.createMenu({
							name : name,
							beforeRemove : function() {
								removeEvent();
							}
						});
		menu.div.append(wrapperDiv);
		var previewDiv, previewImg;
		if (allowPreview) {
			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
			previewImg = K('<img class="ke-preview-img" src="' + path
					+ startNum + '.gif" />');
			wrapperDiv.append(previewDiv);
			previewDiv.append(previewImg);
		}
		function bindCellEvent(cell, j, num) {
			if (previewDiv) {
				cell.mouseover(function() {
							if (j > colsHalf) {
								previewDiv.css('left', 0);
								previewDiv.css('right', '');
							} else {
								previewDiv.css('left', '');
								previewDiv.css('right', 0);
							}
							previewImg.attr('src', path + num + '.gif');
							K(this).addClass('ke-on');
						});
			} else {
				cell.mouseover(function() {
							K(this).addClass('ke-on');
						});
			}
			cell.mouseout(function() {
						K(this).removeClass('ke-on');
					});
			cell.click(function(e) {
						self.insertHtml('<img src="' + path + num
								+ '.gif" border="0" alt="" />').hideMenu()
								.focus();
						e.stop();
					});
		}
		function createEmoticonsTable(pageNum, parentDiv) {
			var table = document.createElement('table');
			parentDiv.append(table);
			if (previewDiv) {
				K(table).mouseover(function() {
							previewDiv.show('block');
						});
				K(table).mouseout(function() {
							previewDiv.hide();
						});
				elements.push(K(table));
			}
			table.className = 'ke-table';
			table.cellPadding = 0;
			table.cellSpacing = 0;
			table.border = 0;
			var num = (pageNum - 1) * cells + startNum;
			for (var i = 0; i < rows; i++) {
				var row = table.insertRow(i);
				for (var j = 0; j < cols; j++) {
					var cell = K(row.insertCell(j));
					cell.addClass('ke-cell');
					bindCellEvent(cell, j, num);
					var span = K('<span class="ke-img"></span>').css(
							'background-position', '-' + (24 * num) + 'px 0px')
							.css('background-image',
									'url(' + path + 'static.gif)');
					cell.append(span);
					elements.push(cell);
					num++;
				}
			}
			return table;
		}
		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
		function removeEvent() {
			K.each(elements, function() {
						this.unbind();
					});
		}
		var pageDiv;
		function bindPageEvent(el, pageNum) {
			el.click(function(e) {
						removeEvent();
						table.parentNode.removeChild(table);
						pageDiv.remove();
						table = createEmoticonsTable(pageNum, wrapperDiv);
						createPageTable(pageNum);
						currentPageNum = pageNum;
						e.stop();
					});
		}
		function createPageTable(currentPageNum) {
			pageDiv = K('<div class="ke-page"></div>');
			wrapperDiv.append(pageDiv);
			for (var pageNum = 1; pageNum <= pages; pageNum++) {
				if (currentPageNum !== pageNum) {
					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
					bindPageEvent(a, pageNum);
					pageDiv.append(a);
					elements.push(a);
				} else {
					pageDiv.append(K('@[' + pageNum + ']'));
				}
				pageDiv.append(K('@&nbsp;'));
			}
		}
		createPageTable(currentPageNum);
	});
});
